home *** CD-ROM | disk | FTP | other *** search
/ Magnum One / Magnum One (Mid-American Digital) (Disc Manufacturing).iso / d12 / egxshow.arc / EGXSHOW.C < prev    next >
Text File  |  1991-09-17  |  34KB  |  1,130 lines

  1. /* egxshow.c */
  2. /* a slide show program by bill buckels 1991 */
  3. /* supported screen mode is EGA 640 x 350 x 16 color    */
  4. /* supported picture format is zsoft pcx ega compatible */
  5. /* written in Microsoft Large Model C Version 5.1       */
  6.  
  7.  
  8. /* this program uses a 2 tank system of data storage   */
  9. /* and breaks its image buffers into arrays of 2 dimns */
  10. /* in order to overcom the data segment limit of 64K.  */
  11.  
  12. #include <stdio.h>
  13. #include <stdlib.h>
  14. #include <fcntl.h>
  15. #include <string.h>
  16. #include <dos.h>
  17. #include <bios.h>
  18. #include <io.h>
  19. #include <malloc.h>
  20. #include <conio.h>
  21.  
  22. #define EGA  '\x10'
  23. #define TEXT '\x03'
  24.  
  25. unsigned char setcrtmode(unsigned char vidmode)
  26. {
  27.     union REGS inregs, outregs;
  28.  
  29.     /* set mode */
  30.     inregs.h.ah = 0;
  31.     inregs.h.al = vidmode;
  32.     int86( 0x10, &inregs, &outregs );
  33.  
  34.     /* get mode */
  35.     inregs.h.ah = 0xf;
  36.     int86( 0x10, &inregs, &outregs );
  37.  
  38.     /* return mode */
  39.     return outregs.h.al;
  40.  
  41. }
  42.  
  43.  
  44. /* the structure of an ega color number...
  45.  
  46.   | 5 | 4 | 3 | 2 | 1 | 0 |
  47.   |   |   |   |   |   |   |
  48.   | R | G | B | R | G | B |  color triples (rgb gun values)
  49.               |
  50.     high      | low
  51.     intensity   intensity
  52.  
  53. */
  54.  
  55.  
  56. /* byte 0-15 are colors... byte 16 is overscan register  */
  57. unsigned char egainfo[17]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
  58. void palettebits(int i, unsigned char color,
  59.                  unsigned char arg1, unsigned char arg2)
  60. {
  61.  
  62.     if(color>0x33)egainfo[i]|=arg1;
  63.  
  64.     if(color>0x77)
  65.         {
  66.             egainfo[i]&=~arg1;
  67.             egainfo[i]|= arg2;
  68.         }
  69.  
  70.      if(color>0xbb)egainfo[i]|=(arg1+arg2);
  71.  
  72.  
  73. }
  74.  
  75.  
  76. void rgb2ega(unsigned char *ptr)
  77. {
  78.     int i;
  79.     unsigned char color;
  80.  
  81.  
  82.     for(i=0;i<16;i++)
  83.     {
  84.         egainfo[i]=0;
  85.         color=*ptr++;
  86.         palettebits(i,color,0x20,0x04);
  87.         color=*ptr++;
  88.         palettebits(i,color,0x10,0x02);
  89.         color=*ptr++;
  90.         palettebits(i,color,0x08,0x01);
  91.      }
  92.      egainfo[0]=0;
  93.  
  94. }
  95.  
  96. int setegapalette()
  97. {
  98.     union REGS regs;
  99.     unsigned char i;
  100.  
  101.     for(i=0;i<16;i++)
  102.     {
  103.         regs.h.ah  = 0x10;  /* function 10h */
  104.         regs.h.al  = 0x00;
  105.         regs.h.bh  = egainfo[i];
  106.         regs.h.bl  = i;
  107.         int86(0x10,®s,®s);
  108.         }
  109.  
  110.         /* dump data to color registers */
  111.  
  112. return 0;
  113.  
  114. }
  115.  
  116. /* use bresenham's algorithm to draw lines */
  117. /* using the writepixel subroutine         */
  118.  
  119. #define BLACK     0
  120. #define BLUE      1
  121. #define GREEN     2
  122. #define CYAN      3
  123. #define RED       4
  124. #define MAGENTA   5
  125. #define BROWN     6
  126. #define WHITE     7
  127. #define GRAY      8
  128. #define LBLUE     9
  129. #define LGREEN    10
  130. #define LCYAN     11
  131. #define LRED      12
  132. #define LMAGENTA  13
  133. #define YELLOW    14
  134. #define BWHITE    15
  135.  
  136. void flood(unsigned char floodcolor)
  137. {
  138.     union REGS rin,rout;
  139.  
  140.     rin.h.dh =24;
  141.     rin.h.dl =79;
  142.     rin.x.cx = 0;
  143.     rin.h.bh= floodcolor;
  144.     rin.x.ax= 0x0600;
  145.     int86(0x10,&rin,&rout);
  146. }
  147.  
  148.  
  149.  
  150. void writepixel(unsigned x, unsigned y, unsigned color)
  151. {
  152.    union REGS reg;
  153.  
  154.    reg.h.ah = 0x0c;
  155.    reg.h.al = (char )color;
  156.    reg.h.bh = 0;
  157.    reg.x.cx = x;
  158.    reg.x.dx = y;
  159.  
  160.    int86(0x10,®,®);
  161.  
  162. }
  163.  
  164.  
  165. void linebox(int x1, int y1, int x2, int y2,unsigned tempcolor)
  166. {
  167.     register x,y;
  168.  
  169.     x2++;
  170.     x=x1;
  171.     y=y1;
  172.     while(x<x2)
  173.     {
  174.       writepixel(x,y,tempcolor);
  175.       x++;
  176.     }
  177.     y++;
  178.     x2--;
  179.     while(y<y2)
  180.     {
  181.         writepixel(x1,y,tempcolor);
  182.         writepixel(x2,y,tempcolor);
  183.         y++;
  184.         }
  185.  
  186.      x2++;
  187.      x=x1;
  188.      while(x<x2)
  189.     {
  190.       writepixel(x,y,tempcolor);
  191.       x++;
  192.     }
  193.  
  194. }
  195.  
  196. void writeline(int x1,int y1,int x2,int y2,unsigned color)
  197. {
  198.     union REGS inregs, outregs;
  199.     #define sign(x) ((x)>0?1:((x)==0?0:(-1)))
  200.     int dx,dy,dxabs,dyabs,i,px,py,sdx,sdy,x,y;
  201.  
  202.      inregs.h.ah = 0x0c;
  203.      inregs.h.al = (char )color;
  204.      inregs.h.bh = 0;
  205.  
  206.  
  207.     dx=x2-x1;
  208.     dy=y2-y1;
  209.     sdx=sign(dx);
  210.     sdy=sign(dy);
  211.     dxabs=abs(dx);
  212.     dyabs=abs(dy);
  213.     x=0;
  214.     y=0;
  215.     px=x1;
  216.     py=y1;
  217.  
  218.     if(dxabs >= dyabs)
  219.     {
  220.         for(i=0;i<=dxabs;i++)
  221.         {
  222.             y+=dyabs;
  223.             if(y>=dxabs)
  224.             {y-=dxabs;
  225.              py+=sdy;
  226.             }
  227.             inregs.x.cx = px;
  228.             inregs.x.dx = py;
  229.             int86(0x10,&inregs,&outregs);
  230.             px+=sdx;
  231.         }
  232.     }
  233.     else{
  234.         for(i=0;i<=dyabs;i++)
  235.         {
  236.             x+=dxabs;
  237.             if(x>=dyabs)
  238.             {
  239.                 x-=dyabs;
  240.                 px+=sdx;
  241.             }
  242.             inregs.x.cx = px;
  243.             inregs.x.dx = py;
  244.             int86(0x10,&inregs,&outregs);
  245.             py+=sdy;
  246.         }
  247.     }
  248. }
  249.  
  250.  
  251. /* romfont routines */
  252.  
  253. #define CRETURN '\x0d'
  254.  
  255. int egatext(char *str, unsigned x, unsigned y, unsigned colorvalue)
  256. {
  257.  
  258.     union REGS inregs, outregs;
  259.  
  260.     int scanline,byte,character,nibble;   /* flags etcetera */
  261.     int counter;
  262.     unsigned char *romfont=(unsigned char *) 0xffa6000el;
  263.     /* a pointer to the 8 x 8 BITMAPPED font in the PC ROM    */
  264.  
  265.     int target = strlen(str);  /* string length               */
  266.  
  267.     if(!target)return 0;
  268.     for(counter=0;counter<target;counter++){
  269.         if(str[counter]<' '||str[counter]>'z')str[counter]=0;
  270.         if(str[counter]==CRETURN)target=counter;
  271.         }
  272.  
  273.      inregs.h.ah = 0x0c;
  274.      inregs.h.al = (char )colorvalue;
  275.      inregs.h.bh = 0;
  276.  
  277.  
  278.  
  279.     for (scanline=0;scanline<8;scanline++) /* finish the current scanline
  280.                                               before advancing to the next */
  281.     {
  282.      for (byte=0;byte<target;byte++)         /* run the scanline           */
  283.      {                                       /* use the current character
  284.                                                 as an indices for the font */
  285.       character = romfont[(str[byte]&0x7f)*8+scanline];
  286.       if (character != 0)
  287.           for (nibble=0;nibble<8;nibble++)
  288.               if (character & 0x80>>nibble)
  289.                        {
  290.                          inregs.x.cx = x+byte*8+nibble;
  291.                          inregs.x.dx = y;
  292.                          int86(0x10,&inregs,&outregs);
  293.                         }
  294.         }
  295.  
  296.      y++;
  297.     }
  298.     return target;
  299.  
  300. }
  301.  
  302. /* center justified x-dimension only */
  303. int egatextM(unsigned char *str,unsigned xorigin,unsigned yorigin,
  304.               unsigned tempcolor)
  305. {
  306.     int target = strlen(str);    /* string length               */
  307.     int counter;
  308.  
  309.     if(!target)return 0;
  310.  
  311.     for(counter=0;counter<target;counter++){
  312.         if(str[counter]<' '||str[counter]>'z')str[counter]=0;
  313.         if(str[counter]==CRETURN)target=counter;
  314.         }
  315.     xorigin=(xorigin-(target*4));/* extrapolate the left edge   */
  316.     egatext(str,xorigin,yorigin,tempcolor); /* pass to the usual function  */
  317.     return target;
  318.  
  319. }
  320.  
  321.  
  322. /* some other font routines */
  323.  
  324. typedef struct               
  325.     {                          
  326.     char filetype[4]          ;
  327.     unsigned char width       ;
  328.     unsigned char height      ;
  329.     unsigned char proportional;
  330.     unsigned char style       ;
  331.     }FONTINFO;                 
  332.  
  333. unsigned char COUR24Bheader[8]={
  334.     'F','P','C','C', 15, 25,  0,  2};
  335.  
  336. unsigned char COUR24Bfont[3123]={
  337.  
  338.     242,  0, 15,198,  0,  3,128,  3,128,  3,128,  3,
  339.     128,  3,128,  3,128,  3,128,  3,128,  3,  0,  3,
  340.       0,  3,199,  0,  3,128,  3,128,204,  0, 15,200,
  341.       0, 30,193,240, 30,193,240, 30,193,240, 30,193,
  342.     240, 30,193,240, 12, 96, 12, 96,220,  0, 15,198,
  343.       0,  3, 96,  3, 96,  3, 96,  3, 96,  3, 96,  3,
  344.      96, 31,193,248,  6,193,192,  6,193,192,  6,193,
  345.     192, 63,193,240,  6,193,192,  6,193,192,  6,193,
  346.     192,  6,193,192,  6,193,192,  6,193,192,202,  0,
  347.      15,196,  0,  1,128,  1,128,  1,128,  3,193,248,
  348.       6, 56, 12, 24, 12,  0, 12,  0,  6,  0,  3,193,
  349.     224,  0, 48,  0, 24,  0,195, 24, 28, 48, 31,193,
  350.     224,  1,128,  1,128,  1,128,  1,128,198,  0, 15,
  351.     198,  0, 15,  0, 25,128, 48,193,192, 48,193,192,
  352.      48,193,192, 25,128, 15, 60,  1,193,224, 15,  0,
  353.     120,193,240,  1,152,  3, 12,  3, 12,  3, 12,  1,
  354.     152,  0,193,240,204,  0, 15,204,  0,  7,193,224,
  355.      13,193,192, 12,  0, 12,  0,  6,  0, 14,  0, 27,
  356.     112, 51, 96, 49,193,192, 48,193,192, 48,193,224,
  357.      25,193,224, 15, 56,204,  0, 15,200,  0,  3,193,
  358.     192,  3,193,192,  7,128,  7,  0, 14,  0, 14,223,
  359.       0, 15,199,  0, 48,  0, 96,  0, 96,  0,193,192,
  360.       0,193,192,  0,193,192,  1,128,  1,128,  1,128,
  361.       1,128,  1,128,  1,128,  1,128,  0,193,192,  0,
  362.     193,192,  0,193,192,  0, 96,  0, 96,  0, 48,198,
  363.       0, 15,198,  0, 24,  0, 12,  0, 12,  0,  6,  0,
  364.       6,  0,  6,  0,  3,  0,  3,  0,  3,  0,  3,  0,
  365.       3,  0,  3,  0,  3,  0,  6,  0,  6,  0,  6,  0,
  366.      12,  0, 12,  0, 24,199,  0, 15,198,  0,  1,128,
  367.       1,128,  1,128, 29,184, 15,193,240,  3,193,192,
  368.       7,193,224, 14,112, 28, 56,218,  0, 15,202,  0,
  369.       1,128,  1,128,  1,128,  1,128,  1,128,  1,128,
  370.      63,193,252,  1,128,  1,128,  1,128,  1,128,  1,
  371.     128,  1,128,206,  0, 15,224,  0,  3,193,192,  3,
  372.     193,192,  7,128,  7,  0, 14,  0, 12,199,  0, 15,
  373.     214,  0, 63,193,252,218,  0, 15,224,  0,  3,193,
  374.     192,  3,193,192,  3,193,192,204,  0, 15,199,  0,
  375.      24,  0, 24,  0, 48,  0, 48,  0, 96,  0, 96,  0,
  376.     193,192,  0,193,192,  1,128,  1,128,  3,  0,  3,
  377.       0,  6,  0,  6,  0, 12,  0, 12,  0, 24,  0, 24,
  378.     201,  0, 15,198,  0,  3,193,192, 14,112, 12, 48,
  379.     212, 24, 12, 48, 14,112,  3,193,192,204,  0, 15,
  380.     198,  0,  3,128, 31,128,  1,128,  1,128,  1,128,
  381.       1,128,  1,128,  1,128,  1,128,  1,128,  1,128,
  382.       1,128,  1,128,  1,128,  1,128, 31,193,248,204,
  383.       0, 15,198,  0,  7,128, 28,193,224,196, 48,  0,
  384.      48,  0, 48,  0, 96,  0, 96,  0,193,192,  1,128,
  385.       3,  0,  6,  0, 12,  0, 24,  0,194, 48, 63,193,
  386.     240,204,  0, 15,198,  0,  3,193,224, 14, 48,194,
  387.      24,  0, 24,  0, 24,  0, 48,  0, 96,  3,193,192,
  388.       0, 96,  0, 48,  0, 24,  0, 24,  0, 24, 48, 24,
  389.      28, 48,  7,193,224,204,  0, 15,198,  0,  1,193,
  390.     224,  1,193,224,  3, 96,  3, 96,  6, 96,  6, 96,
  391.      12, 96, 12, 96, 24, 96, 24, 96, 48, 96, 63,193,
  392.     240,  0, 96,  0, 96,  0, 96,  1,193,240,204,  0,
  393.      15,198,  0, 31,193,240, 24,  0, 24,  0, 24,  0,
  394.      24,  0, 24,  0, 31,193,192, 28,112,  0, 48,  0,
  395.      24,  0, 24,  0, 24,  0, 24,  0, 48, 56,112, 15,
  396.     193,192,204,  0, 15,199,  0,193,248,  3,128,  6,
  397.       0, 12,  0, 12,  0, 24,  0, 24,  0, 27,193,224,
  398.      30, 48, 28,199, 24, 12, 24, 14, 48,  3,193,224,
  399.     204,  0, 15,198,  0, 63,193,240,196, 48,  0, 96,
  400.       0, 96,  0, 96,  0,193,192,  0,193,192,  0,193,
  401.     192,  0,193,192,  1,128,  1,128,  1,128,  3,  0,
  402.       3,  0,  3,205,  0, 15,198,  0,  7,193,192, 28,
  403.     112, 24,194, 48, 24, 48,194, 24, 48, 28,112,  7,
  404.     193,192, 28,112, 24,194, 48, 24, 48, 24, 48,194,
  405.      24, 48, 28,112,  7,193,192,204,  0, 15,198,  0,
  406.       3,193,192, 14, 96, 12, 48,200, 24, 12, 56, 14,
  407.     120,  3,193,216,  0, 24,  0, 24,  0, 48,  0, 48,
  408.       0,193,224, 31,128,204,  0, 15,208,  0,  3,193,
  409.     192,  3,193,192,  3,193,192,202,  0,  3,193,192,
  410.       3,193,192,  3,193,192,204,  0, 15,208,  0,  3,
  411.     193,192,  3,193,192,  3,193,192,202,  0,  3,193,
  412.     192,  3,193,192,  7,128,  7,  0, 14,  0, 12,199,
  413.       0, 15,205,  0, 60,  0,193,240,  3,193,192, 15,
  414.       0, 60,  0,112,  0, 60,  0, 15,  0,  3,193,192,
  415.       0,193,240,  0, 60,208,  0, 15,212,  0,127,193,
  416.     252,196,  0,127,193,252,214,  0, 15,204,  0,120,
  417.       0, 30,  0,  7,128,  1,193,224,  0,120,  0, 28,
  418.       0,120,  1,193,224,  7,128, 30,  0,120,209,  0,
  419.      15,202,  0, 15,193,192, 24, 96, 24, 48,  0, 48,
  420.       0, 48,  0, 48,  0, 96,  1,193,192,  3,  0,  3,
  421.     197,  0,  3,128,  3,128,204,  0, 15,198,  0,  7,
  422.     193,192, 28, 96, 24,198, 48,193,240, 49,176, 51,
  423.      48, 51, 48, 51, 48, 51, 48, 49,176, 48,193,248,
  424.      48,  0, 48,  0, 24,  0, 28,112,  7,193,224,200,
  425.       0, 15,202,  0, 31,193,192,  3,193,192,  6, 96,
  426.       6, 96,  6, 96, 12, 48, 12, 48, 12, 48, 31,193,
  427.     248,196, 24, 48, 12, 48, 12,124, 62,204,  0, 15,
  428.     202,  0,127,193,240,195, 24, 12, 24, 12, 24, 12,
  429.     194, 24, 31,193,240,195, 24, 12, 24, 12, 24, 12,
  430.      24, 12,194, 24,127,193,240,204,  0, 15,202,  0,
  431.       3,193,236, 14, 60,194, 28, 24, 12, 48,  0, 48,
  432.       0, 48,  0, 48,  0, 48,  0, 48,  0, 24, 12,194,
  433.      28, 14, 56,  3,193,224,204,  0, 15,202,  0,127,
  434.     193,224, 48, 56, 48, 24, 48, 12, 48, 12, 48, 12,
  435.      48, 12, 48, 12, 48, 12, 48, 12, 48, 12, 48, 24,
  436.      48, 56,127,193,224,204,  0, 15,202,  0,127,193,
  437.     248,198, 24, 25,128, 25,128, 31,128, 25,128, 25,
  438.     128, 24, 12, 24, 12, 24, 12, 24, 12,127,193,252,
  439.     204,  0, 15,202,  0, 63,193,252,199, 12,193,192,
  440.      12,193,192, 15,193,192, 12,193,192, 12,193,192,
  441.      12,  0, 12,  0, 12,  0, 12,  0, 63,193,192,204,
  442.       0, 15,202,  0,  7,193,216, 28,120,194, 56, 48,
  443.      24, 96,  0, 96,  0, 96,  0, 96,  0, 97,193,252,
  444.      96, 24, 48, 24, 56, 24, 28, 48,  7,193,224,204,
  445.       0, 15,202,  0,194,126,202, 24, 31,193,248,204,
  446.      24,194,126,204,  0, 15,202,  0, 31,193,248,  1,
  447.     128,  1,128,  1,128,  1,128,  1,128,  1,128,  1,
  448.     128,  1,128,  1,128,  1,128,  1,128,  1,128, 31,
  449.     193,248,204,  0, 15,202,  0,  7,193,254,  0, 48,
  450.       0, 48,  0, 48,  0, 48,  0, 48,  0, 48,  0,200,
  451.      48, 96, 24,193,224, 15,128,204,  0, 15,202,  0,
  452.     126,124, 24, 48, 24, 96, 24,193,192, 25,128, 27,
  453.       0, 31,128, 29,193,192, 24,193,224, 24, 96, 24,
  454.     112, 24, 48, 24, 56,126, 30,204,  0, 15,202,  0,
  455.     127,128, 12,  0, 12,  0, 12,  0, 12,  0, 12,  0,
  456.      12,  0, 12,  0, 12,  0,200, 12,127,193,252,204,
  457.       0, 15,202,  0,120, 30, 56, 28, 56, 28,196, 60,
  458.      54,108, 54,108, 51,193,204, 51,193,204, 48, 12,
  459.      48, 12, 48, 12, 48, 12,124, 62,204,  0, 15,202,
  460.       0,193,248,193,254, 56, 24, 60, 24, 54, 24, 54,
  461.      24, 51, 24, 51, 24, 49,152, 49,152, 48,193,216,
  462.      48,193,216, 48,120, 48, 56,193,254, 56,204,  0,
  463.      15,202,  0,  7,193,192, 28,112,194, 56, 48, 24,
  464.      96, 12, 96, 12, 96, 12, 96, 12, 96, 12, 96, 12,
  465.      48, 24,194, 56, 28,112,  7,193,192,204,  0, 15,
  466.     202,  0, 63,193,240, 12, 24,201, 12, 24, 15,193,
  467.     240, 12,  0, 12,  0, 12,  0, 12,  0, 12,  0, 63,
  468.     193,192,204,  0, 15,202,  0,  7,193,192, 28,112,
  469.     194, 56, 48, 24, 96, 12, 96, 12, 96, 12, 96, 12,
  470.      96, 12, 96, 12, 48, 24,194, 56, 28,112,  7,193,
  471.     192,  7, 28, 29,193,240,200,  0, 15,202,  0,127,
  472.     193,224, 24, 48,201, 24, 48, 31,193,224, 24,193,
  473.     192, 24, 96, 24, 48, 24, 48,194, 24,126, 30,204,
  474.       0, 15,202,  0,  7,193,216, 28,120, 48, 56, 48,
  475.      24, 48,  0, 28,  0,  7,193,192,  0,112,  0, 24,
  476.       0, 24, 48, 24, 56, 24, 60, 48, 55,193,224,204,
  477.       0, 15,202,  0, 63,193,252, 49,140, 49,140, 49,
  478.     140, 49,140,  1,128,  1,128,  1,128,  1,128,  1,
  479.     128,  1,128,  1,128,  1,128, 15,193,240,204,  0,
  480.      15,202,  0,126,193,252, 48, 24, 48, 24, 48, 24,
  481.      48, 24, 48, 24, 48, 24, 48, 24, 48, 24, 48, 24,
  482.      48, 24, 48,194, 24, 48, 15,193,224,204,  0, 15,
  483.     202,  0,194,126, 48, 12, 48, 12,196, 24, 12, 48,
  484.      12, 48, 12, 48,  6, 96,  6, 96,  6, 96,  3,193,
  485.     192,  3,193,192,  1,128,204,  0, 15,202,  0,194,
  486.     126, 48, 12, 48, 12, 49,140, 49,140, 51,193,204,
  487.      51,193,204, 27,193,216, 30,120, 30,120, 30,120,
  488.      28, 56, 28, 56, 28, 56,204,  0, 15,202,  0,194,
  489.     126,194, 24, 12, 48, 12, 48,  6, 96,  6, 96,  3,
  490.     193,192,  1,128,  3,193,192,  6, 96, 12, 48, 12,
  491.      48,194, 24,194,126,204,  0, 15,202,  0,124, 62,
  492.     194, 24, 12, 48, 12, 48,  6, 96,  6, 96,  3,193,
  493.     192,  1,128,  1,128,  1,128,  1,128,  1,128,  1,
  494.     128, 15,193,240,204,  0, 15,202,  0, 63,193,248,
  495.      48, 24,195, 48, 96, 48,193,192,  0,193,192,  1,
  496.     128,  3,  0,  6,  0,  6, 24, 12,195, 24, 48, 24,
  497.      63,193,248,204,  0, 15,198,  0,  1,193,224,  1,
  498.     128,  1,128,  1,128,  1,128,  1,128,  1,128,  1,
  499.     128,  1,128,  1,128,  1,128,  1,128,  1,128,  1,
  500.     128,  1,128,  1,128,  1,128,  1,128,  1,193,224,
  501.     198,  0, 15,198,  0, 24,  0, 24,  0, 12,  0, 12,
  502.       0,  6,  0,  6,  0,  3,  0,  3,  0,  1,128,  1,
  503.     128,  0,193,192,  0,193,192,  0, 96,  0, 96,  0,
  504.      48,  0, 48,  0, 24,  0, 24,200,  0, 15,198,  0,
  505.       7,128,  1,128,  1,128,  1,128,  1,128,  1,128,
  506.       1,128,  1,128,  1,128,  1,128,  1,128,  1,128,
  507.       1,128,  1,128,  1,128,  1,128,  1,128,  1,128,
  508.       7,128,198,  0, 15,198,  0,  1,128,  3,193,192,
  509.       7,193,224, 14,112, 28,194, 56, 28, 48, 12,222,
  510.       0, 15,238,  0,194,255,194,  0, 15,198,  0, 14,
  511.       0,  7,  0,  3,128,  1,193,192,228,  0, 15,208,
  512.       0,  7,193,192, 28, 96,  0, 48,  0, 48,  0, 48,
  513.      15,193,240, 24,198, 48,112, 31,193,252,204,  0,
  514.      15,198,  0,120,  0, 24,  0, 24,  0, 24,  0, 24,
  515.       0, 27,193,240, 30,194, 28, 12, 24,  6, 24,  6,
  516.      24,  6, 24,  6, 24,  6, 28, 12, 30, 28,123,193,
  517.     240,204,  0, 15,208,  0,  7,193,248, 28, 56,194,
  518.      24, 48, 24, 48,  0, 48,  0, 48,  0, 48,  0, 24,
  519.     194, 28, 56,  7,193,224,204,  0, 15,199,  0,120,
  520.       0, 24,  0, 24,  0, 24,  0, 24, 15,193,216, 56,
  521.     120, 48, 56, 96, 24, 96, 24, 96, 24, 96, 24, 96,
  522.      24, 48,194, 56,120, 15,193,222,204,  0, 15,208,
  523.       0,  7,193,224, 28, 56,194, 24, 48, 12, 48, 12,
  524.      63,193,252, 48,  0, 48,  0, 24,  0,194, 28,  7,
  525.     193,240,204,  0, 15,199,  0,193,252,  1,128,  3,
  526.       0,  3,  0,  3,  0, 31,193,248,  3,  0,  3,  0,
  527.       3,  0,  3,  0,  3,  0,  3,  0,  3,  0,  3,  0,
  528.       3,  0, 31,193,248,204,  0, 15,208,  0, 15,193,
  529.     222, 56,120, 48, 56, 96, 24, 96, 24, 96, 24, 96,
  530.      24, 96, 24, 48,194, 56,120, 15,193,216,  0, 24,
  531.       0, 24,  0, 48,  0,112, 31,193,192,194,  0, 15,
  532.     198,  0,120,  0, 24,  0, 24,  0, 24,  0, 24,  0,
  533.      27,193,224, 30, 48, 28,207, 24,194,126,204,  0,
  534.      15,198,  0,  1,128,  1,128,  1,128,196,  0, 15,
  535.     128,  1,128,  1,128,  1,128,  1,128,  1,128,  1,
  536.     128,  1,128,  1,128,  1,128, 31,193,248,204,  0,
  537.      15,199,  0, 96,  0, 96,  0, 96,196,  0, 31,193,
  538.     240,  0, 48,  0, 48,  0, 48,  0, 48,  0, 48,  0,
  539.      48,  0, 48,  0, 48,  0, 48,  0, 48,  0, 48,  0,
  540.      48,  0, 96,  0,193,224, 31,128,194,  0, 15,198,
  541.       0, 60,  0, 12,  0, 12,  0, 12,  0, 12,  0, 12,
  542.     193,248, 12, 96, 12,193,192, 13,128, 15,  0, 15,
  543.       0, 13,128, 12,193,192, 12, 96, 12, 48, 60,124,
  544.     204,  0, 15,198,  0, 31,128,  1,128,  1,128,  1,
  545.     128,  1,128,  1,128,  1,128,  1,128,  1,128,  1,
  546.     128,  1,128,  1,128,  1,128,  1,128,  1,128, 63,
  547.     193,252,204,  0, 15,208,  0,193,255,120, 57,193,
  548.     204, 49,140, 49,140, 49,140, 49,140, 49,140, 49,
  549.     140, 49,140, 49,140,193,253,193,206,204,  0, 15,
  550.     208,  0,123,193,224, 30, 48, 28,207, 24,194,126,
  551.     204,  0, 15,208,  0,  7,193,224, 28, 56,194, 24,
  552.      48, 12, 48, 12, 48, 12, 48, 12, 48, 12,194, 24,
  553.      28, 56,  7,193,224,204,  0, 15,208,  0,123,193,
  554.     240, 30,194, 28, 12, 24,  6, 24,  6, 24,  6, 24,
  555.       6, 24,  6, 28, 12, 30, 28, 27,193,240, 24,  0,
  556.      24,  0, 24,  0, 24,  0,127,195,  0, 15,208,  0,
  557.      15,193,222, 56,120, 48, 56, 96, 24, 96, 24, 96,
  558.      24, 96, 24, 96, 24, 48,194, 56,120, 15,193,216,
  559.       0, 24,  0, 24,  0, 24,  0, 24,  0,193,254,194,
  560.       0, 15,208,  0, 30,120,  7,193,204,  7,  0,  6,
  561.       0,  6,  0,  6,  0,  6,  0,  6,  0,  6,  0,  6,
  562.       0, 63,193,240,204,  0, 15,208,  0,  7,193,248,
  563.      12, 56, 12, 24, 12,  0,  7,193,192,  0,112,  0,
  564.      24,  0,195, 24, 28, 48, 31,193,224,204,  0, 15,
  565.     200,  0, 12,  0, 12,  0, 12,  0, 12,  0, 63,193,
  566.     240, 12,  0, 12,  0, 12,  0, 12,  0, 12,  0, 12,
  567.       0, 12,  0, 12,  0,  6, 56,  3,193,224,204,  0,
  568.      15,208,  0,194,120,207, 24, 56, 12,120,  7,193,
  569.     220,204,  0, 15,208,  0,194,126,196, 24, 12, 48,
  570.      12, 48, 12, 48,  6, 96,  6, 96,  3,193,192,  3,
  571.     193,192,  1,128,204,  0, 15,208,  0,124, 62, 48,
  572.      12, 48, 12, 49,140, 25,152, 27,193,216, 27,193,
  573.     216, 27,193,216, 15,193,240, 14,112, 14,112,204,
  574.       0, 15,208,  0, 62,124,194, 24, 12, 48,  6, 96,
  575.       3,193,192,  1,128,  3,193,192,  6, 96, 12, 48,
  576.     194, 24, 62,124,204,  0, 15,208,  0,194,124, 48,
  577.      24, 48,194, 24, 48, 24, 48, 24, 96, 12, 96, 12,
  578.     193,192,  6,193,192,  7,128,  3,128,  3,  0,  3,
  579.       0,  6,  0,  6,  0,127,128,194,  0, 15,208,  0,
  580.      31,193,248,195, 24, 48,  0, 96,  0,193,192,  1,
  581.     128,  3,  0,  6,  0, 12,195, 24, 31,193,248,204,
  582.       0, 15,199,  0,193,224,  1,128,  1,128,  1,128,
  583.       1,128,  1,128,  1,128,  1,128,  1,128,  7,  0,
  584.       1,128,  1,128,  1,128,  1,128,  1,128,  1,128,
  585.       1,128,  1,128,  0,193,224,198,  0, 15,198,  0,
  586.       1,128,  1,128,  1,128,  1,128,  1,128,  1,128,
  587.       1,128,  1,128,  1,128,  1,128,  1,128,  1,128,
  588.       1,128,  1,128,  1,128,  1,128,  1,128,  1,128,
  589.       1,128,198,  0, 15,198,  0,  7,  0,  1,128,  1,
  590.     128,  1,128,  1,128,  1,128,  1,128,  1,128,  1,
  591.     128,  0,193,224,  1,128,  1,128,  1,128,  1,128,
  592.       1,128,  1,128,  1,128,  1,128,  7,199,  0, 15,
  593.     212,  0, 31, 28, 59,184,113,193,240,216,  0, 15,
  594.     202,  0,193,255,193,254,193,255,193,254,193,224,
  595.      14,193,224, 14,193,224, 14,193,224, 14,193,224,
  596.      14,193,224, 14,193,224, 14,193,224, 14,193,224,
  597.      14,193,224, 14,193,255,193,254,193,255,193,254,
  598.     204,  0, 15};
  599.  
  600. unsigned char *fontbuffer;
  601. FONTINFO fontinfo;
  602.  
  603. int membitfont(unsigned char info[8],unsigned char name[],int target)
  604. {
  605.     int size;
  606.     int wordcount=0;
  607.     int x;
  608.     int packet;
  609.     int offset=0;
  610.     unsigned char byte,bytecount;
  611.  
  612.     fontinfo.filetype[0]=info[0];
  613.     fontinfo.filetype[1]=info[1];
  614.     fontinfo.filetype[2]=info[2];
  615.     fontinfo.filetype[3]=info[3];
  616.     fontinfo.width=info[4];
  617.     fontinfo.height=info[5];
  618.     fontinfo.proportional=info[6];
  619.     fontinfo.style=info[7];
  620.  
  621.     x=(fontinfo.width/8)+1;
  622.     if((fontinfo.width%8)==0)x--;
  623.     packet=(x*fontinfo.height)+1;
  624.  
  625.     size=packet*256 ;
  626.     fontbuffer=malloc(size);
  627.  
  628.     /* unpacked */
  629.     if(fontinfo.filetype[1]=='O')
  630.        {
  631.        memcpy(fontbuffer,name,size);
  632.        return 0;
  633.        }
  634.  
  635.  
  636.     if(fontinfo.filetype[3]=='C')
  637.     {
  638.        offset=packet*32;
  639.        memset(fontbuffer,0,size);
  640.        /* for(wordcount=0;wordcount<size;wordcount+=packet)
  641.            fontbuffer[wordcount+packet-1]=fontinfo.width;  */
  642.            }
  643.  
  644.     wordcount=0;
  645.     do{ bytecount=1;                          /* start with a seed count */
  646.         byte=name[wordcount];
  647.         wordcount++;
  648.                                               /* check to see if its raw */
  649.         if(0xC0 == (0xC0 &byte)){             /* if its not, run encoded */
  650.                     bytecount= 0x3f &byte;
  651.                     byte=name[wordcount];
  652.                     wordcount++;
  653.                     }
  654.         for(packet=0;packet<bytecount;packet++)
  655.                         {
  656.                         fontbuffer[offset]=byte;
  657.                         offset++;
  658.                         }
  659.         }while(wordcount<target);
  660.         return 0;
  661. }
  662.  
  663.  
  664. void unloadbitfont(void)
  665. {
  666.     free(fontbuffer);
  667. }
  668.  
  669.  
  670. void egabitfont(unsigned char *str,
  671.                 int xorigin, int yorigin,unsigned colorvalue,
  672.                 char justify)
  673. {
  674.     union REGS inregs, outregs;
  675.     int x1;
  676.     int scanline,y,byte,character,nibble;
  677.     int target = strlen(str) ;
  678.  
  679.     int x,xwidth,xgap=0,xfactor;
  680.  
  681.     /* offset into the array */
  682.     int yoffset,scanoffset;
  683.     int xoffset =  (fontinfo.width/8)+1;
  684.  
  685.      inregs.h.ah = 0x0c;
  686.      inregs.h.al = (char )colorvalue;
  687.      inregs.h.bh = 0;
  688.  
  689.     if(!(fontinfo.width%8))xoffset-=1;
  690.     yoffset = ((fontinfo.height)*(xoffset))+1;
  691.  
  692.     /* strip hard returns */
  693.     if(str[target-1]=='\n')(target-=1);
  694.                     
  695.     /* justification */
  696.     switch(toupper(justify))
  697.         {
  698.         case 'M':
  699.         case 'C': xorigin-=(((target*fontinfo.width)/2)+xoffset);
  700.  
  701.         default : break;
  702.         }
  703.  
  704.  
  705. #define BOLD 2
  706.  
  707.     if(fontinfo.style==BOLD)xgap++;
  708.  
  709.     for (scanline=0;scanline<fontinfo.height;scanline++)
  710.     {
  711.      y = yorigin+scanline;
  712.      scanoffset = scanline*xoffset;
  713.      x=0;
  714.  
  715.      for (byte=0;byte<target;byte++)
  716.      {
  717.  
  718.       for(xfactor=0;xfactor<xoffset;xfactor++)
  719.       {
  720.        /* the offset into the array is constant */
  721.        character = fontbuffer[(yoffset*str[byte])+(scanoffset+xfactor)];
  722.  
  723.        if (character != 0)
  724.           for (nibble=0;nibble<8;nibble++)
  725.                if (character & 0x80>>nibble)
  726.                    {
  727.                    x1=(xorigin+x+(xfactor*8)+nibble);
  728.                    if(x1>-1 && x1<640 && y<350)
  729.                    {
  730.                          inregs.x.cx = x1;
  731.                          inregs.x.dx = y;
  732.                          int86(0x10,&inregs,&outregs);
  733.                         }
  734.                         }
  735.                         }
  736.       /* get the proportional spacing info */
  737.       xwidth = fontbuffer[(yoffset*str[byte])+yoffset-1]+xgap;
  738.       x+=xwidth;
  739.  
  740.       }
  741.       }
  742.  
  743. }
  744.  
  745.  
  746. int maple[]={
  747. 73,65,98,70,106,55,106,55,130,74,122,33,142,42,160,11,
  748. 178,42,198,33,190,74,214,55,222,70,247,65,241,95,253,102,
  749. 208,139,217,157,165,151,165,187,155,187,155,151,103,157,
  750. 112,139,67,102,79,95,73,65,-1,-2};
  751.  
  752.  
  753. int cga2ega(int *PIX,unsigned color)
  754. {
  755.   /* illustrates integer conversion of screen coordinates from */
  756.   /* CGA MED RES graphics mode to 640 x 350 EGA mode  */
  757.  
  758.   int X=0,Y=1,true=X,done=Y;
  759.   int newx,oldx,newy,oldy;
  760.  
  761.   drawstart:;
  762.  
  763.                          /* conversion from 320 x 200 to 640 x 350   */
  764.   oldx= PIX[X]<<1;       /* use a ratio 320 to 640 for the x dimn    */
  765.   oldy=(PIX[Y]*7)/4;     /* use a ratio of 350 to 200 for the y dimn */
  766.  
  767.   while(done!=true)
  768.      {
  769.       X=X+2 ; Y=Y+2;
  770.       if(PIX[X]!=(-1)){
  771.                          newx=PIX[X]<<1;
  772.                          newy=(PIX[Y]*7)/4;
  773.                          writeline(oldx,oldy,newx,newy,color);
  774.                          oldx=newx;
  775.                          oldy=newy;
  776.                         }
  777.       else(done=true);
  778.       }
  779.       true = 0; done = 1;
  780.       if (PIX[X]==PIX[Y]){ X=X+2;Y=Y+2;
  781.                            goto drawstart;
  782.                         }
  783.  
  784.  
  785. }
  786.  
  787.  
  788.  
  789.  
  790.  
  791. void titleblock()
  792. {
  793.     flood(BLUE);               /* flood dark blue      */
  794.     linebox(0,0,639,349,LRED); /* draw a red box       */
  795.     cga2ega(maple,LRED);
  796.  
  797.     egabitfont("EGXSHOW(C) by Bill Buckels",319,120,BWHITE,'M');
  798.     egatextM("Copyright 1991",319,150,BWHITE);
  799.     egatextM("Correspondence can Be Sent To:",319,170,CYAN);
  800.     egatextM("Bill Buckels",319,190,BWHITE);
  801.     egatextM("982 Hector Ave.",319,200,BWHITE);
  802.     egatextM("Winnipeg, Manitoba, Canada",319,210,BWHITE);
  803.  
  804.  
  805.     egatextM("one moment please... setting up!",319,8,LCYAN);
  806.     egatextM("**** PRESS ESCAPE TO EXIT WHEN DONE ****",319,332,YELLOW);
  807.  
  808. }
  809.  
  810. /* type conversion function */
  811. unsigned int byteword(unsigned char a, unsigned char b){return b<<8|a;}
  812. unsigned char pcxheader[128];
  813. int checkforpcx(unsigned char *pcxheader)
  814. {
  815.     unsigned int zsoft,codetype,pixbits;
  816.     unsigned int xmin, ymin, xmax, ymax;
  817.     unsigned int no_planes, bytesperline;
  818.     int invalid = -1, valid = 0, status=valid;
  819.  
  820.     /* read the file header */
  821.  
  822.     zsoft   =pcxheader[0];
  823.     codetype=pcxheader[2];
  824.     pixbits =pcxheader[3];
  825.  
  826.     if(zsoft!=10)        status = invalid;
  827.     if(codetype!=1)      status = invalid;
  828.     if(pixbits !=1)      status = invalid;
  829.  
  830.     xmin=byteword(pcxheader[4],pcxheader[5]);
  831.     ymin=byteword(pcxheader[6],pcxheader[7]);
  832.     xmax=byteword(pcxheader[8],pcxheader[9]);
  833.     ymax=byteword(pcxheader[10],pcxheader[11]);
  834.     no_planes   =pcxheader[65];
  835.     bytesperline=byteword(pcxheader[66],pcxheader[67]);
  836.  
  837.  
  838.       if(xmin != 0  )       status = invalid;
  839.       if(ymin != 0  )       status = invalid;
  840.       if(xmax != 639)       status = invalid;
  841.       if(ymax != 349)       status = invalid;
  842.       if(no_planes!=4)      status = invalid;
  843.       if(bytesperline !=80)status = invalid;
  844.       return status;
  845.  
  846. }
  847.  
  848. char indexmap[]={ 1,2,4,8};
  849. void index_set(indexval)
  850.     {
  851.         outp(0x3c4,2);
  852.         outp(0x3c5,indexmap[indexval]);
  853.         }
  854.  
  855. char far *packbuffer[2],*rawbuffer[2];
  856.  
  857. int egaread(char *name)
  858. {
  859.  
  860.     unsigned count1,count2;
  861.  
  862.     unsigned long byteoff;
  863.     unsigned int packet;
  864.     unsigned char byte,bytecount;
  865.     unsigned int temp;
  866.     int safety;
  867.     char far *ptr,*ptr2;
  868.  
  869.  
  870.  
  871.     int fh;
  872.  
  873.     if((fh = open(name,O_RDONLY|O_BINARY))==-1)return -1;
  874.  
  875.     read(fh,pcxheader,128);
  876.     if(checkforpcx(pcxheader)!=0)
  877.         {
  878.           close(fh);
  879.           return -1;
  880.           }        
  881.  
  882.      ptr=(char far *)&packbuffer[0][0];
  883.      ptr2=(char far *)&rawbuffer[0][0];
  884.  
  885.      if(read(fh,packbuffer[0],(unsigned)56000)==(unsigned)56000)
  886.         read(fh,packbuffer[1],(unsigned)56000);
  887.      close(fh);
  888.  
  889.      temp=0;
  890.      byteoff=0;
  891.      safety=0;
  892.  
  893.      count1=0;
  894.      count2=0;
  895.  
  896.     do{ bytecount=1;                          /* start with a seed count */
  897.         byte=ptr[count1];
  898.         count1++;
  899.  
  900.         if(count1==56000)
  901.         {
  902.           count1=0;
  903.           ptr=(char far *)&packbuffer[1][0];
  904.          }
  905.                                               /* check to see if its raw */
  906.         if(0xC0 == (0xC0 &byte)){             /* if its not, run encoded */
  907.                     bytecount= 0x3f &byte;
  908.                     byte=ptr[count1];
  909.                     count1++;
  910.                     if(count1==56000)
  911.                     {
  912.                      count1=0;
  913.                      ptr=(char far *)&packbuffer[1][0];
  914.                      }
  915.                      }
  916.  
  917.         switch(temp)
  918.         {
  919.          case 320:  temp=0;
  920.          case 0  :
  921.          case 80 :
  922.          case 160:
  923.          case 240:
  924.                     safety=0;
  925.         }
  926.  
  927.         for(packet=0;packet<bytecount;packet++){
  928.                      ptr2[count2]=byte;
  929.                      count2++;
  930.                      if(count2==56000)
  931.                      {
  932.                      count2=0;
  933.                      ptr2=(char far *)&rawbuffer[1][0];
  934.                      }
  935.                      byteoff++;
  936.                      safety++;
  937.                      temp++;
  938.                      if(safety>79)packet=bytecount;
  939.                      }
  940.         }while(byteoff<112000l);
  941.     return 0;
  942. }
  943.  
  944. /* scroll window to clear screen */
  945. void egashow()
  946. {
  947.    unsigned ctr=0;
  948.    unsigned count2=0;
  949.  
  950.    char far *crtptr;
  951.    char far *bufptr;
  952.    char *ptr;
  953.  
  954.    int i,j;
  955.  
  956.      /* to clear between pictures use flood */
  957.      /* then set palette here             */
  958.      /* flood(0); */
  959.  
  960.     bufptr=(char far *)&rawbuffer[0][0];
  961.  
  962.     for(i=0;i<350;i++)
  963.     {
  964.       crtptr=(char *)0xa0000000l+ctr;
  965.       ctr+=80;
  966.       for(j=0;j<4;j++)
  967.       {
  968.         index_set(j);
  969.         memcpy(crtptr,&bufptr[count2],80);
  970.         count2+=80;
  971.         if(count2==56000)
  972.                      {
  973.                      count2=0;
  974.                      bufptr=(char far *)&rawbuffer[1][0];
  975.                      }
  976.         }
  977.         }
  978.  
  979.         ptr=(char *)&pcxheader[16];
  980.         rgb2ega(ptr);
  981.         setegapalette();
  982.  
  983.  
  984. }
  985.  
  986.  
  987. void (interrupt _far *int1C)();
  988. unsigned ticker=0;
  989. void interrupt timertick(void)
  990. {
  991.  
  992.     ticker++;
  993.     int1C();
  994. }
  995.  
  996.  
  997. main(int argc, char **argv)
  998. {
  999.         unsigned target=56000;
  1000.         FILE *fp;
  1001.         char buffer[66];
  1002.         char buffer2[66];
  1003.         int DONE =0, status=0;
  1004.         char *wordptr;
  1005.         char c;
  1006.         float fseconds;
  1007.         unsigned timeout;
  1008.  
  1009.     membitfont(COUR24Bheader,COUR24Bfont,sizeof(COUR24Bfont));
  1010.    if( (packbuffer[0]=malloc(target))==NULL)
  1011.    {
  1012.     puts("Not enough memory...");
  1013.     exit(0);
  1014.     }
  1015.  
  1016.    if( (packbuffer[1]=malloc(target))==NULL)
  1017.    {
  1018.     puts("Not enough memory...");
  1019.     exit(0);
  1020.     }
  1021.  
  1022.   if( (rawbuffer[0]=malloc(target))==NULL)
  1023.    {
  1024.     puts("Not enough memory...");
  1025.     exit(0);
  1026.     }
  1027.   if( (rawbuffer[1]=malloc(target))==NULL)
  1028.    {
  1029.     puts("Not enough memory...");
  1030.     exit(0);
  1031.     }
  1032.  
  1033.  
  1034.  
  1035.  
  1036.         if((fp=fopen(argv[1],"r"))!=NULL)
  1037.         {
  1038.          if(setcrtmode(EGA)!=EGA)
  1039.          {
  1040.          puts("Sorry... EGA adapter required.");
  1041.          fclose(fp);
  1042.          exit(0);
  1043.          }
  1044.  
  1045.  
  1046.    if(argc==3 && atoi(argv[2])>0)
  1047.    {
  1048.    fseconds=(float)18.2*atoi(argv[2]);
  1049.    }
  1050.    else
  1051.    fseconds=(float)18.2*3;
  1052.  
  1053.    timeout=(unsigned )fseconds;
  1054.  
  1055.  
  1056.         _disable();
  1057.         int1C=  _dos_getvect(0x1C);
  1058.         _dos_setvect(0x1C, timertick);
  1059.         _enable();
  1060.  
  1061.               titleblock();
  1062.               fgets(buffer,66,fp);
  1063.               wordptr=strtok(buffer,".  \n");
  1064.               sprintf(buffer2,"%s.PCX",buffer);
  1065.               egaread(buffer2);
  1066.  
  1067.          while(!DONE)
  1068.          {
  1069.               egashow();
  1070.  
  1071.               if(fgets(buffer,66,fp)==NULL)
  1072.               {
  1073.                 rewind(fp);
  1074.                 fgets(buffer,66,fp);
  1075.                 }
  1076.  
  1077.  
  1078.               ticker=0;
  1079.               if(kbhit())if((c=getch())==27)DONE++;
  1080.  
  1081.               if(!DONE)
  1082.               {
  1083.               wordptr=strtok(buffer,".  \n");
  1084.               sprintf(buffer2,"%s.PCX",buffer);
  1085.               egaread(buffer2);
  1086.                }
  1087.  
  1088.               if(!DONE)
  1089.               {
  1090.               while(ticker<timeout)
  1091.                 {
  1092.                    if(kbhit())
  1093.                    {
  1094.                     ticker=timeout;
  1095.                     if((c=getch())==27)DONE++;
  1096.                     if(c==0)getch();
  1097.                     }
  1098.                   }
  1099.                 }
  1100.               }
  1101.  
  1102.         setcrtmode(TEXT);
  1103.  
  1104.         /* repair the timer tick */
  1105.         _disable();
  1106.         _dos_setvect(0x1C, int1C);
  1107.         _enable();
  1108.  
  1109.         fclose(fp);
  1110.  
  1111.         }
  1112.         else
  1113.         {
  1114.             printf("EGXSHOW(C) Copyright by Bill Buckels 1991\n");
  1115.             printf("Usage is \"EGXSHOW [scriptname] [time-seconds]\"\n");
  1116.         }
  1117.  
  1118.         free(packbuffer[0]);
  1119.         free(packbuffer[1]);
  1120.         free(rawbuffer[0]);
  1121.         free(rawbuffer[1]);
  1122.         unloadbitfont();
  1123.         exit(0);
  1124.  
  1125. }
  1126.  
  1127.  
  1128.  
  1129.  
  1130.